iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0

今天想要分享 Laravel 比較進階的寫法,這不是在官方文件中看到的,所以可能只是大多數人推薦的開發方式,可以當作參考就好。因為怕一下子講太深,前面會先簡單帶過基礎名詞。

什麼是模式 (pattern)?

以我自己的理解來說,pattern 就是一種開發的習慣 / 偏好,它在大部分時候都是可選的,端看遇到的情境適不適用?它不是最優解,通常是權衡之下的一種選擇。

基本的 MVC 三要素

  • M: Model 可以很簡單當作跟資料庫互動的媒介。對應 app/Models 資料夾
  • V: View 使用者介面呈現。對應 resoure/views 資料夾
  • C: Controller 從 Model 取得資料,經過處理到 View 的中間過程。對應 app/Http/Controllers 資料夾

controller 越來越肥,怎麼辦?

有開發過專案大概都經歷過這個階段,一個 controller 從一百多行默默成長到一千多百行。閱讀開始有負擔,這時候就可以開始把跟這個 controller 比較沒有關係的部分拆出去。因為路由的設計,通常會是一個名稱分配一個 controller,那些拆分出去的小功能就很適合丟到 app/Services 裡面。

請看以下範例 (來源)

app\Services\EmailService.php

<?php

namespace App\Services;
use Illuminate\Mail\Message;
use Mail;

/**
 * Class EmailService
 *
 * @package \App\Services
 */
/**
 * Class EmailService
 *
 * @package App\Services
 */
class EmailService
{
    /**
     * @var \Mail
     */
    protected $mailer;

    /**
     * 将相依的 Mailer 注入到 EmailService
     * EmailService constructor.
     *
     * @param $mailer
     */
    public function __construct(Mail $mailer)
    {
        $this->mailer = $mailer;
    }

    /**
     * 发送 Email的逻辑写在 send() 不是使用 Mail Facade,而是使用 $this->mailer
     * @param array $request
     */
    public function send(array $request)
    {
        $this->mailer->queue('email.index',$request,function(Message $message){
            $message->sender(env('MAIL_USERNAME'));
            $message->subject(env('MAIL_SUBJECT'));
            $message->to(env('MAIL_TO_ADDR'));
        });
    }
}

app\Controllers\UserController.php

<?php

namespace App\Http\Controllers;

use App\Services\EmailService;
use Illuminate\Http\Request;

/**
 * Class UserController
 *
 * @package App\Http\Controllers
 */
class UserController extends Controller
{
    /**
     * @var \App\Services\EmailService
     */
    protected $emailService;


    /**
     * @param \Illuminate\Http\Request $request
     */
    public function store(Request $request)
    {
        $this->emailService->send($request->all());
    }
}

service 跟 Service Provider 是一樣的東西嗎?

剛開始聽到 service 的時候還真的會跟 Service Provider 搞混在一起,但其實這兩個東西運作的方式是不一樣的,只是剛剛好都有 service 這個單字出現而已。Service Provider 提供的服務跟 Laravel 的核心運作有比較大的關係。看官方文件介紹 Service Provider 會發現它需要在 config/app.php 先定義,然後還要處理 boot() 和 regist() 的部分,跟上面的範例就差非常多。所以不要把 service 跟 Service Provider 搞混囉

以上,今天介紹一點 Laravel 的進階寫法,謝謝縮看


上一篇
貳拾貳。PWA 是 web 和 app 的和解共生?
下一篇
貳肆。如何設計一個模組 (元件)? - 專案開發紀實
系列文
程式小萌新的學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言